UniLearn 的注册系统和 LMS 中的学生 ID 并不一致。团队需要生成多份报表,每一份对 “哪些源数据行必须出现?”
复用实验 6 的数据库
如果你已在实验 6 中运行过 lab6_7_setup.sql ,请保留这些数据。否则,请在 pgAdmin 中打开助教提供的共享安装文件并运行一次。在每次新建 Query Tool 连接时选择 lab6_7 。
从你熟悉的连接开始
- 查看
students和lms_roster:22 个注册系统 ID 和 6 个 LMS ID。 - 运行实验 6 中匹配规则所用的 INNER JOIN。
- 找出同时存在于两个来源中的四个 ID。
- 解释为什么该结果不可能是任一来源的完整列表。
五项报表需求
列出共有账户;保留每位注册学生;保留每个 LMS 账户;核对两个来源;生成学生–课程组合。你需要针对这些需求编写 INNER、LEFT、RIGHT、FULL 和 CROSS JOIN 查询。
✍️ 推测缺失的上下文
S103 已注册但没有 LMS 账户。S901 已导入 LMS 但不在注册系统中。在一份完整的报表中,它们各自应归入哪一部分?
SET search_path TO lab6_7;
SELECT s.student_id AS registry_id, s.student_name,
r.student_id AS lms_id, r.lms_name
FROM students AS s
INNER JOIN lms_roster AS r
ON s.student_id = r.student_id
ORDER BY s.student_id;核对匹配到的 ID
共四行:S101、S102、S105 和 S121。每个 ID 在两张表中都是唯一的,因此每对匹配项只出现一次。这份报表仅包含共有账户。
Uma(S121)虽然没有选课记录,但拥有 LMS 账户。账户匹配并不能证明其参与了课程。
查看两个数据来源
LMS 名单是一份未经验证的导入数据。它刻意没有设置指向 students 的外键,因此 S901 和 S902 只能存在于该来源中。
SET search_path TO lab6_7;
SELECT student_id, student_name
FROM students
ORDER BY student_id;
SELECT student_id, lms_name
FROM lms_roster
ORDER BY student_id;| LMS ID | LMS 姓名 | 是否在注册系统中? |
|---|---|---|
| S101 | Alice Wong | 是 |
| S102 | Ben Lau | 是 |
| S105 | Emma Li | 是 |
| S121 | Uma Shah | 是 |
| S901 | 导入访客 A | 否 |
| S902 | 导入访客 B | 否 |
共享安装脚本还包含 8 门课程、37 条选课记录、8 份作业和 30 份提交记录,供后续任务使用。所有记录均为虚构。
选择连接方式前先读懂需求
| 需求 | 所需结果 |
|---|---|
| 共有账户 | 仅匹配的 ID 对。 |
| 注册系统覆盖范围 | 每位注册学生,即使没有 LMS 账户。 |
| LMS 导入审计 | 每个导入的 LMS 账户,即使没有注册系统匹配项。 |
| 核对两个系统 | 共有账户,以及仅存在于任一来源中的记录。 |
| 课程规划 | 每位所选学生与每门所选课程两两配对。 |
实验 6 已讲解匹配对如何构成数据行。在本实验中,通过更改连接类型来控制未匹配的行或生成所有组合,然后检查每一结果行代表什么。